﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestionCegep.Objects;
using Oracle.DataAccess.Client;
using System.IO;
using System.Diagnostics;


namespace GestionCegep
{
    public partial class Form1 : Form
    {
        string CONNEXION_STRING = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=NEPTUNE.UQTR.CA)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SID=COURSBD))); User Id=SMI1002_22;Password=87znpb84"; // ConnexionString lue a partir d'un fichier
        DataStore dataStore;     // Instanciation de l'objet ou se trouve toutes les donnees
        bool erreurLock;         // Detection d'une erreur

        // Constructeur de l'interface
        public Form1()
        {
            InitializeComponent();

            cboRapports.Items.AddRange(Enum.GetNames(typeof(Rapports.ChoixRapports))); // Ajout du choix des rapports dans le ComboBox

            try
            {
                //// Lecture de la connexionString dans le fichier
                //using (StreamReader sr = new StreamReader("connexion.txt"))
                //{
                //    String line = sr.ReadToEnd();
                //    CONNEXION_STRING = line;
                //}

                dataStore = new DataStore(CONNEXION_STRING); // Creation du DataStore
            }
            catch (OracleException exception)
            {
                MessageBox.Show(String.Format("Erreur lors du chargement des données\n{0}", exception.Message), "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Environment.Exit(-1);
            }

            tsslInfoConnexion.Text = String.Format(tsslInfoConnexion.Tag.ToString(), dataStore.CurrentConnection.DatabaseName);
        }

        // Lors de l'ouverture de l'interface
        private void Form1_Load(object sender, EventArgs e)
        {
            // On ne veut pas que les colonnes se generent automatiquement
            dgvDepartements.AutoGenerateColumns = false;
            dgvCours.AutoGenerateColumns = false;
            dgvEnseignants.AutoGenerateColumns = false;
            dgvEtudiants.AutoGenerateColumns = false;
            dgvInscriptions.AutoGenerateColumns = false;

            // Configuration des comboBox
            cEnseignantDepartement.DataSource = dataStore.Departements;
            cEnseignantDepartement.DisplayMember = "Nom";
            cEnseignantDepartement.ValueMember = "Self";

            cCoursDepartement.DataSource = dataStore.Departements;
            cCoursDepartement.DisplayMember = "Nom";
            cCoursDepartement.ValueMember = "Self";
            cCoursEnseignant.DataSource = dataStore.Enseignants;
            cCoursEnseignant.DisplayMember = "NomComplet";
            cCoursEnseignant.ValueMember = "Self";

            cInscriptionCours.DataSource = dataStore.LesCours;
            cInscriptionCours.DisplayMember = "Sigle";
            cInscriptionCours.ValueMember = "Self";
            cInscriptionEtudiant.DataSource = dataStore.Etudiants;
            cInscriptionEtudiant.DisplayMember = "NomComplet";
            cInscriptionEtudiant.ValueMember = "Self";

            // Remplissage des dataGridView (Tableau des donnees)
            dgvDepartements.DataSource = dataStore.Departements;
            dgvEnseignants.DataSource = dataStore.Enseignants;
            dgvEtudiants.DataSource = dataStore.Etudiants;
            dgvInscriptions.DataSource = dataStore.Inscriptions;
            dgvCours.DataSource = dataStore.LesCours;

            cboRapports.SelectedIndex = 0; // Par defaut, le premier rapport est selectionné
        }

        // Erreur avec le DataGridView des Departements
        private void dgvDepartements_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            e.Cancel = true;
            Console.WriteLine(e.Exception.Message);
        }

        // Evenements qui se produit lorsque l'on clique sur le bouton ajouter
        private void btnAjouter_Click(object sender, EventArgs e)
        {
            try
            {
                // Création d'un nouvel objet persistant (Abstrait)
                PersistentObject newPersistentObject;

                // On vérifie quel onglet est sélectionné
                // Departement
                if (tcGestions.SelectedTab.Equals(tpDepartement))
                {
                    newPersistentObject = new Departement(); // Instanciation d'un nouveau departement
                    dataStore.Insert(newPersistentObject); // Insertion d'un nouveau departement
                    dgvDepartements.DataSource = null;
                    dgvDepartements.DataSource = dataStore.Departements; // On reinitialise le datagridview des departements
                }
                // Cours
                else if (tcGestions.SelectedTab.Equals(tpCours))
                {
                    using (FrmInput input = new FrmInput()) // On affiche le Pop-up pour saisir le Sigle (Clé primaire) du cours
                    {
                        // On s'assure que le sigle respecte le format indiquer
                        if (input.ShowDialog("Veuillez entrer le sigle du nouveau cours en respectant le format demandé", "XXX0000", "LLL0000") == System.Windows.Forms.DialogResult.OK)
                        {
                            newPersistentObject = new Cours(input.InputText); // Instanciation d'un nouveau cours
                            dataStore.Insert(newPersistentObject); // Insertion du nouveau cours
                            dgvCours.DataSource = null;
                            dgvCours.DataSource = dataStore.LesCours; // On reinitialise le datagridview des cours
                        }
                    }
                }
                // Etudiants
                else if (tcGestions.SelectedTab.Equals(tpEtudiants))
                {
                    using (FrmInput input = new FrmInput()) // On affiche le Pop-up pour saisir le Matricule (Clé primaire) du cours
                    {
                        // On s'assure que le sigle respecte le format indiquer
                        if (input.ShowDialog("Veuillez entrer le matricule du nouvel étudiant en respectant le format demandé", "0000000", "0000000") == System.Windows.Forms.DialogResult.OK)
                        {
                            newPersistentObject = new Etudiant(input.InputText); // Instanciation d'un nouvel etudiant
                            dataStore.Insert(newPersistentObject); // Insertion du nouvel etudiant
                            dgvEtudiants.DataSource = null;
                            dgvEtudiants.DataSource = dataStore.Etudiants; // On reinitialise le datagridview des etudiants
                        }
                    }
                }
                // Enseignants
                else if (tcGestions.SelectedTab.Equals(tpEnseignants))
                {
                    newPersistentObject = new Enseignant(); // Instanciation d'un nouvel enseignant
                    dataStore.Insert(newPersistentObject); // Insertion du nouvel enseignant
                    dgvEnseignants.DataSource = null;
                    dgvEnseignants.DataSource = dataStore.Enseignants; // On reinitialise le datagridview des enseignants
                }
                // Inscriptions
                else if (tcGestions.SelectedTab.Equals(tpInscriptions))
                {
                    newPersistentObject = new Inscription(); // Instanciation d'une nouvelle inscription
                    dataStore.Insert(newPersistentObject); // Insertion d'un nouvelle inscription
                    dgvInscriptions.DataSource = null;
                    dgvInscriptions.DataSource = dataStore.Inscriptions; // On reinitialise le datagridview des inscriptions
                }
            }
            catch (OracleException exception)
            {
                MessageBox.Show(String.Format("Une erreur est survenue lors de l'ajout dans la base de données\n{0}", exception.Message),
                                "Erreur",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void btnSupprimer_Click(object sender, EventArgs e)
        {
            PersistentObject persistentObjectToDelete; // Objet qui sera supprimé
            try
            {
                // Si departement
                if (tcGestions.SelectedTab.Equals(tpDepartement))
                {
                    persistentObjectToDelete = (PersistentObject)dgvDepartements.SelectedRows[0].DataBoundItem; // On recupere l'objet selectionné
                    dataStore.Delete(persistentObjectToDelete); // On supprimer l'objet en question
                    dgvDepartements.DataSource = null;
                    dgvDepartements.DataSource = dataStore.Departements; // On reinitialise le datagridview correspondant
                }
                // Si cours
                else if (tcGestions.SelectedTab.Equals(tpCours))
                {
                    persistentObjectToDelete = (PersistentObject)dgvCours.SelectedRows[0].DataBoundItem;  // On recupere l'objet selectionné
                    dataStore.Delete(persistentObjectToDelete); // On supprimer l'objet en question
                    dgvCours.DataSource = null;
                    dgvCours.DataSource = dataStore.LesCours; // On reinitialise le datagridview correspondant
                }
                // Si enseignants
                else if (tcGestions.SelectedTab.Equals(tpEnseignants))
                {
                    persistentObjectToDelete = (PersistentObject)dgvEnseignants.SelectedRows[0].DataBoundItem;  // On recupere l'objet selectionné
                    dataStore.Delete(persistentObjectToDelete); // On supprimer l'objet en question
                    dgvEnseignants.DataSource = null;
                    dgvEnseignants.DataSource = dataStore.Enseignants; // On reinitialise le datagridview correspondant
                }
                // Si etudiants
                else if (tcGestions.SelectedTab.Equals(tpEtudiants))
                {
                    persistentObjectToDelete = (PersistentObject)dgvEtudiants.SelectedRows[0].DataBoundItem;  // On recupere l'objet selectionné
                    dataStore.Delete(persistentObjectToDelete); // On supprimer l'objet en question
                    dgvEtudiants.DataSource = null;
                    dgvEtudiants.DataSource = dataStore.Etudiants; // On reinitialise le datagridview correspondant
                }
                // Si inscriptions
                else if (tcGestions.SelectedTab.Equals(tpInscriptions))
                {
                    persistentObjectToDelete = (PersistentObject)dgvInscriptions.SelectedRows[0].DataBoundItem; // On recupere l'objet selectionné
                    dataStore.Delete(persistentObjectToDelete); // On supprimer l'objet en question
                    dgvInscriptions.DataSource = null;
                    dgvInscriptions.DataSource = dataStore.Inscriptions; // On reinitialise le datagridview correspondant
                }
            }
            catch (OracleException exception)
            {
                MessageBox.Show(String.Format("Une erreur est survenue lors de la suppression dans la base de données\n{0}", exception.Message),
                                "Erreur",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        // Lorsque l'on debute la modification d'une cellule
        private void dgv_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            DataGridView dgv = (DataGridView)sender;
            if (e.RowIndex > -1)
            {
                try
                {
                    PersistentObject objectToBeUpdate = (PersistentObject)dgv.Rows[e.RowIndex].DataBoundItem; // On sélectionne l'objet a modifier
                    dataStore.LockForUpdate(objectToBeUpdate); // On modifie l'objet en question
                }
                catch (OracleException exception)
                {
                    erreurLock = true;
                    dgv.EndEdit();
                    MessageBox.Show("Une erreur est survenue lors de la tentative de vérouillage de la ligne en modification\n{0}", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        // Lorsque la valeur d'une cellule change
        private void dgv_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (!erreurLock) // S'il n'y a pas d'erreurs
            {
                DataGridView dgv = (DataGridView)sender;
                if (e.RowIndex > -1)
                {
                    try
                    {
                        PersistentObject objectUpdated = (PersistentObject)dgv.Rows[e.RowIndex].DataBoundItem; // On sélectionne l'objet a modifier
                        dataStore.CommitUpdate(objectUpdated); // On confirme la modification de l'objet en question
                    }
                    catch (OracleException exception)
                    {
                        MessageBox.Show(String.Format("Une erreur est survenue lors de la mise à jours dans la base de données\n{0}", exception.Message),
                                        "Erreur",
                                        MessageBoxButtons.OK,
                                        MessageBoxIcon.Error);
                    }
                }
            }
            else
                erreurLock = false;
        }

        // Lorsque l'on termine la modification d'une cellule
        private void dgv_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (!erreurLock) // S'il n'y a pas d'erreur
            {
                try
                {
                    dataStore.CancelUpdate(); // On annule la modification 
                }
                catch (OracleException exception)
                {
                    MessageBox.Show(String.Format("Une erreur est survenue lors de la tentative d'annulation de la modification\n{0}", exception.Message),
                                    "Erreur",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);

                }
            }
            else
                erreurLock = false;
        }

        // Lorsque l'on appuie sur le bouton generer pour generer un rapport
        private void btnGenerer_Click(object sender, EventArgs e)
        {
            
            try
            {   
                // Creation du rapport
                Rapport rapport = new Rapport(cboRapports.SelectedItem.ToString(), Rapports.rapports[cboRapports.SelectedIndex], Path.GetDirectoryName(Application.ExecutablePath));
                if (rapport.GenererRapport(dataStore.CurrentConnection))
                {
                    Process.Start(rapport.FullDestinationName); // Debut du processus de generation du rapport
                }
                else
                {
                    MessageBox.Show("Le rapport n'a pas été généré car aucune donnée n'a été trouvé.");
                }
            }
            catch (OracleException oraException)
            {
                MessageBox.Show(String.Format("Une erreur est survenue lors de l'extraction des données dans la BD\n{0}", oraException.Message), "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (IOException ioException)
            {
                MessageBox.Show(String.Format("Une erreur est survenue lors de l'écriture du fichier rapport\n{0}", ioException.Message), "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // Lorsque l'on appuie sur le bouton quitter
        private void quitterToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Êtes-vous sur de vouloir quitter la superbe application de gestion?", "Certain?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            {
                Environment.Exit(0);
            }
        }

        // Lorsque l'on ferme l'application
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = (MessageBox.Show("Êtes-vous sur de vouloir quitter la superbe application de gestion?", "Certain?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != System.Windows.Forms.DialogResult.Yes);
        }
    }
}
